﻿using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

namespace GigaSite.Web.Models.Validators
{
    /// <summary>
    /// Фабрика по производству валидаторов для моделей
    /// </summary>
    public static class ModelValidatorsFactory
    {
        /// <summary>
        /// Таблица маппингов валидаторов
        /// </summary>
        private static Dictionary<Type, Type> ValidatorsBindings { get; set; }

        /// <summary>
        /// Статический конструктор
        /// </summary>
        static ModelValidatorsFactory()
        {
            ValidatorsBindings = new Dictionary<Type, Type>();
        }

        /// <summary>
        /// Присваивает модели указанный валидатор
        /// </summary>
        /// <typeparam name="TModel">Тип модели</typeparam>
        /// <typeparam name="TValidator">Тип валидатора</typeparam>
        public static void BindModelToValidator<TModel,TValidator>()
        {
            ValidatorsBindings.Add(typeof(TModel),typeof(TValidator));
        }

        /// <summary>
        /// Возвращает валидатор для указанной модели
        /// </summary>
        /// <typeparam name="T">Тип модели которую требуется провалидировать</typeparam>
        /// <returns>Инстанс валидатора для модели</returns>
        public static IModelValidator<T> GetValidator<T>()
        {
            var type = typeof (T);
            Type validatorType = null;
            if (!ValidatorsBindings.TryGetValue(type,out validatorType))
            {
                // TODO: Записать в лог
                throw new ValidationException("Не удалось установить тип валидатора для модели "+type.FullName);
            }

            var validatorInstance = Activator.CreateInstance(validatorType);
            return (IModelValidator<T>) validatorInstance;
        }
    }
}